home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
games
/
sakiba
/
source
/
chranim.c
next >
Wrap
Text File
|
2000-06-20
|
4KB
|
160 lines
/********************************************************
格闘シミュレーション「さきば」
キャラクタアニメーション
********************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys\dos.h>
#include <sys\iocs.h>
#include "sakiba.h"
#include "chranim.h"
#include "screen.h"
#define CODE1 0x40 /* スプライト格納場所 */
#define CODE2 0xa0
#define PALET1 0x08 /* パレット格納場所 */
#define PALET2 0x0c
/******************************************
アニメーションを進める
引数 spr = スプライトパターン
戻り値 アニメーション終端か
******************************************/
Bool anim_spr(SPR_PARAM* spr)
{
short p;
if ( spr->now.pat == NULL ) { /* 未使用 */
return FALSE;
}
if ( (spr->pat_cnt >= 0) && (--spr->pat_cnt <= 0) ) { /* パターン */
if ( spr->seq.pat[0] == SEQ_END ) { /* 終端 */
return TRUE;
}
if ( spr->seq.pat[0] == SEQ_LOOP ) { /* 先頭に戻る */
spr->seq.pat = spr->now.pat;
}
if ( (p = *(spr->seq.pat)++) == NOPUT ) { /* 非表示 */
spr->pat = NULL;
}
else {
spr->pat = spr->pat_data + p;
}
spr->pat_cnt = *(spr->seq.pat)++;
}
if ( (spr->x_cnt >= 0) && (--spr->x_cnt <= 0) ) { /* x座標 */
if ( spr->seq.x[3] == SEQ_LOOP ) { /* 先頭に戻る */
spr->seq.x = spr->now.x;
}
spr->x = (REAL)*(spr->seq.x)++;
spr->dx = (REAL)*(spr->seq.x)++;
spr->ddx = (REAL)*(spr->seq.x)++;
spr->x_cnt = *(spr->seq.x)++;
}
else {
spr->x += spr->dx; /* 速度 */
spr->dx += spr->ddx; /* 加速度 */
}
if ( (spr->y_cnt >= 0) && (--spr->y_cnt <= 0) ) { /* y座標 */
if ( spr->seq.y[3] == SEQ_LOOP ) { /* 先頭に戻る */
spr->seq.y = spr->now.y;
}
spr->y = (REAL)*(spr->seq.y)++;
spr->dy = (REAL)*(spr->seq.y)++;
spr->ddy = (REAL)*(spr->seq.y)++;
spr->y_cnt = *(spr->seq.y)++;
}
else {
spr->y += spr->dy; /* 速度 */
spr->dy += spr->ddy; /* 加速度 */
}
return FALSE;
}
/******************************************
アニメーションシーケンス設定
引数 spr = スプライトパターン
seq = シーケンス
num = シーケンス番号
******************************************/
void set_sequence(SPR_PARAM* spr, SEQUENCE* seq)
{
if ( seq ) {
spr->now = *seq; /* 現在のシーケンス */
spr->seq = spr->now;
spr->pat_cnt = 0; /* カウンタクリア */
spr->x_cnt = 0;
spr->y_cnt = 0;
}
else { /* 未使用 */
spr->now.pat = NULL;
spr->pat = NULL;
}
}
/*******************************************
パターン描画
引数 spr = スプライトパターン
num = プレイヤー番号
x, y = 描画原点
*******************************************/
void draw_pat(SPR_PARAM* spr, int num, int x, int y)
{
CODE code, *p;
int xx, i, j;
if ( spr->pat == NULL ) { /* 非表示 */
return;
}
if ( num == PLAYER1 ) {
code = CODE1 + PALET1*0x100; /* 先頭スプライトコード */
p = spr->pat->code_l; /* パターン */
x += (int)((spr->x + 65536/2)/65536) - spr->pat->w*(16/2) + 16;
}
else {
code = CODE2 + PALET2*0x100; /* 先頭スプライトコード */
p = spr->pat->code_r; /* パターン */
x += (int)((-spr->x + 65536/2)/65536) - spr->pat->w*(16/2) + 16;
}
y += (int)((spr->y + 65536/2)/65536) - spr->pat->h*(16/2) + 16;
for (i = 0; i < spr->pat->h; i++) {
xx = x;
for (j = 0; j < spr->pat->w; j++) {
put_sprite(code + *p++, xx, y); /* スプライト描画 */
xx += 16;
}
y += 16;
}
}
/******************************************
キャラクタスプライト読み込み
引数 chr = キャラクタ
戻り値 0 : 読み込み完了
1 : 読み込み失敗
******************************************/
int load_chr(CHR_PARAM* chr)
{
chr->spr[0].pat_data = chr->data->pat_data; /* パターンデータ設定 */
chr->spr[1].pat_data = chr->data->pat_data;
if ( chr->num == PLAYER1 ) { /* プレイヤー1 */
return load_sprite(chr->data->sp_name, chr->data->pal_name[chr->num],
CODE1, PALET1);
}
else { /* プレイヤー2 */
return load_sprite(chr->data->sp_name, chr->data->pal_name[chr->num],
CODE2, PALET2);
}
}
/*********************** End of File *********************************************/